package com.lovo.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;


//@Aspect:作用是把当前类标识为一个切面供容器读取
@Aspect
@Component
@Slf4j(topic="test")//日志
public class LogAspect {
//    创建切点
//    service下所有类中以find开头的方法，任意参数的方法
    @Pointcut("execution(* com.lovo.service..find*(..))")
    public void logPointcut(){}
//  创建通知  before方法前 ，after方法后 ，AfterThrowing 方法异常 ，Around环绕，包括其他所有
//    @Before("logPointcut()")
//    public void sayHello(JoinPoint joinPoint){
//        System.out.println("Hello："+joinPoint.getSignature());
//    }
//    @After("logPointcut()")
//    public void sayBye(JoinPoint joinPoint){
//        System.out.println("Bye："+joinPoint.getSignature());
//    }
//    @AfterThrowing("logPointcut()")
//    public void sayError(JoinPoint joinPoint){
//        System.out.println("Error："+joinPoint.getSignature());
//    }
    @Around("execution(* com.lovo..*(..))")
    public Object sayAround(ProceedingJoinPoint joinPoint)throws Throwable{
        long startTime=System.currentTimeMillis();
       log.debug("进入方法："+joinPoint.getSignature());
        Object obj = null;
        try {
            obj = joinPoint.proceed(joinPoint.getArgs());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            log.error("抛出异常："+joinPoint.getSignature());

        }
        long endTime=System.currentTimeMillis();
        log.debug("退出方法："+joinPoint.getSignature());
        //执行方法时间
        Double time =(endTime-startTime)/1000.0;
        log.debug("方法执行时间"+time+"秒");
        return obj;
    }
}
